package Data;


import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

import javax.microedition.lcdui.Image;

import com.sun.midp.io.j2me.storage.File;

import Common.MyHT;
import Common.MyStream;
import Common.MyVT;
import Common.Util;

public class DataGame {
	
	public static final byte LEG = 0;
	public static final byte BODY = 1;
	public static final byte HEAD = 2;
	public static final byte HAT = 3;
	public static final byte EYE = 4;
	public static final byte HAIR = 5;
	public static final byte WING = 6;
	
	public static final byte IMAGE_X1= 0;
	public static final byte IMAGE_X2 = 1;
	public static final byte IMAGE_X3 = 2;
	
	public static byte imageMonster[][];	
	public static byte imgItemMap[][][]=new byte[3][][];
	public static byte imgItemPart[][][]=new byte[3][][];
	public static byte imgItemSkill[][];//image of skill
	
	public static byte _imageMonster[];	
	public static byte _imgItemMap[][];
	public static byte _imgItemPart[][];
	public static byte _imgItemSkill[][];//image of skill
		
	public static byte allPartInfo[];
	public static byte allInfoSmallImageMap[];
	public static byte allInfoSmallImagePlayer[];
	public static byte allInfoSmallImageSkill[];
	public static byte allTreeInfo[];
	public static byte allSkillInfo[];
		
	public static byte allBigImgMap[][];
	public static byte allBigImgPlayer[][][]=new byte [3][][];
	public static byte allBigImgNPC[][];
	public static byte allBigImgSkill[][];//big image of skill
	
	public static Vector all_monster=new Vector();
	public static  DataEffect[] Effects;//list aaa effect
	
	public static DataMap[] ALL_MAP_DATA;
	//public static String[] NAME_ITEM_QUEST = Text.NAME_ITEM_QUEST_ALL;
	public static boolean puttingImage;
	private static long lastTimeUpdate;// thoi gian cuoi cung kiem tra thoi han image

	
	//image of game
	//public static Hashtable[]images = (Hashtable[])new Hashtable[3];
	public static MyHT images= new MyHT("images");
	Vector vtImage ;
	
	static {
		for(int i=0;i<images.size();i++)
		{
			String ii=i+"";
			images.put(ii, null );
		}			
	}
//	public static final Texture loadImage(String filename) {
//		
//		Texture img = null;
//        img = DrawJ.loadImage(filename);
//        return img;
//    }
	
	public static Image LoadImage(int id )
	{
		Image image=null;
		if(images.get(id+"")!=null)
		{
			image= (Image) images.get(id+"");
		}
		else// khong ton tai trong hashtable
		{

			try {
				if(id<10000){// 10k item map
					image=Util.loadImage("/smallImage/"+(id)+".png");										
				}else if(id>=10000&&id<20000){//Part
					//m.dos.write(imgItemPart[typeImage][idImg-10000]);
					image=Util.loadImage("/smallImage/"+(id)+".png");
					
				}else if(id>=20000&&id<20500){// image big Player 500 tam

					image=Util.loadImage("/smallImage/"+(id-20000)+".png");
					
				}else if(id>=20500&&id<21000){// img Big Map 500 tam
				}else if(id>=21000&&id<31000){// 10k item skill
					
					image=Util.loadImage("/smallImage/"+(id-21000)+".png");
					
				}else if(id>=31000&&id<31500){// img Big skill 500 tam
					
					image=Util.loadImage("/smallImage/"+(id-31000)+".png");
					
				}else if(id>=31500&&id<32000){// img Big skill 500 tam		
					
					image=Util.loadImage("/smallImage/"+(id-31500)+".png");					
				}
								
			} catch (Exception e) {
				e.printStackTrace();
			}
			//gui thong tin image
			if(image!=null)
			{					
				images.put(id+"", image);
			} 
		}		
		return image;					
	}

//	//remove image khi vuot qua thoi gian cho phep
//	public static void RemoveImage()
//	{
//		new Thread(){// xu ly update
//			
//			public void run() {
//				Thread.currentThread().setName("RemoveImage");
//				while(true){
//					
//					try {
//						Thread.sleep(100);
//					} catch (InterruptedException e) {
//						// TODO Auto-generated catch block
//						e.printStackTrace();
//					}	
//				
//					long timeRemoveImage=(System.currentTimeMillis()-lastTimeUpdate)/60000;
//					//thoi gian 5 phut kiem tra 1 lan de thuc hien remove
//					if(timeRemoveImage>=5)
//					{
//						//đang putting thi sleep 100 millis time
//						while (puttingImage) 
//						{
//							try {
//								Thread.sleep(100);
//							} catch (InterruptedException e) {
//								// TODO Auto-generated catch block
//								e.printStackTrace();
//							}
//						}
//						lastTimeUpdate=System.currentTimeMillis();
//						for(int i=0;i<images.length;i++)//image x1,x2,x3
//						{
//							Enumeration names;
//							names = images[i].keys();
//							synchronized(names) {//trong thoi gian duyet hashtable thi khong duoc xu ly put hay remove
//								
//								   while(names.hasMoreElements()) {//duyet qua tung image
//								        Short id = (Short) names.nextElement();//key
////								    	System.out.println(i+"  remove>>>>>>>>  "+id);
//								        if(images[i].containsKey(id))
//								        {						        	
//								        	long time= (System.currentTimeMillis()-images[i].get(id).timeBegin)/60000;				      
//											//nhung image co thoi gian ton tai vuot qua 5 phut se duoc remove
//									        if(time>=5)//remove nhung image da qua thoi gian 5 phut
//											{
//									        	//System.out.println(i+"  remove>>>>>>>>  "+id+","+images.length);
//									        	images[i].remove(id);
//											}
//								        }			      							        
//								    }
//							}
//						   	
////						     System.out.println(i+" List image "+images[i].keySet());
//						}						
//					}									
//				}
//			}
//		}.start();
//	}

	public  static void load(){		
		//RemoveImage();//remove image khong su dung trong thoi gian 5 phut
		
		// load map data
		DataInputStream dis=null;
		try {	
			 dis =new DataInputStream(MyStream.readFile("/File/map")); 

			short totalMap=dis.readShort();
			
			ALL_MAP_DATA=new DataMap[totalMap];
			for(int i=0;i<totalMap;i++){
				short idMap=dis.readShort();
				
				ALL_MAP_DATA[idMap]=new DataMap();
				ALL_MAP_DATA[idMap].w=dis.readShort();
				ALL_MAP_DATA[idMap].h=dis.readShort();
				int nBkg=dis.readShort();
				for(int j=0;j<nBkg;j++){
					DataItemMap data=new DataItemMap();
					data.idSmallImage=dis.readShort();
					data.x=dis.readShort();
					data.y=dis.readShort();
					data.flip=(byte)dis.readShort();
					ALL_MAP_DATA[idMap].allBkgMap.addElement(data);
				}
				int nTree=dis.readShort();
				for(int j=0;j<nTree;j++){
					DataItemMap data=new DataItemMap();
					data.idSmallImage=dis.readShort();
					data.x=dis.readShort();
					data.y=dis.readShort();
					data.flip=(byte)dis.readShort();
					ALL_MAP_DATA[idMap].allItemInMap.addElement(data);
				}
				int nMonster=dis.readShort();
				for(int j=0;j<nMonster;j++){
					DataMonsterMap data=new DataMonsterMap();
					data.id=dis.readShort();
					data.xDefault=dis.readShort();
					data.yDefault=dis.readShort();
					ALL_MAP_DATA[idMap].allMonsterInMap.addElement(data);
				}	
				
				int nEffect=dis.readShort();
				for(int j=0;j<nEffect;j++)
				{
					DataEffectMap effectMap= new DataEffectMap();
					effectMap.id=dis.readShort();
					effectMap.x=dis.readShort();
					effectMap.y=dis.readShort();
					effectMap.w=dis.readShort();
					effectMap.h=dis.readShort();
					ALL_MAP_DATA[idMap].allEffect.addElement(effectMap);
				}
			}
			dis.close();
			//dis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
//		try {
//			fis=new FileInputStream("map/data/tree_Part");
//			dis=new DataInputStream(fis);
//			allPartInfo=new byte[dis.available()];
//			dis.read(allPartInfo);
//			fis.close();
//			dis.close();
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		try {
//			fis=new FileInputStream("map/data/tree_TypeTree");
//			dis=new DataInputStream(fis);
//			allTreeInfo=new byte[dis.available()];
//			dis.read(allTreeInfo);
//			fis.close();
//			dis.close();
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		
//		try {//thong tin skill
//			fis=new FileInputStream("map/data/tree_Skill");
//			dis=new DataInputStream(fis);
//			allSkillInfo=new byte[dis.available()];
//			dis.read(allSkillInfo);
//			fis.close();
//			dis.close();
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		
		try {//thong tin effect
			dis =new DataInputStream(MyStream.readFile("/File/tree_Effect")); 

			int countEffect=dis.readShort();//so luong effect
			Effects= new DataEffect[countEffect];
			for(int i=0;i<countEffect;i++)
			{
				DataEffect effect= new DataEffect();
				
				effect.w=dis.readShort();//chieu rong effect
				effect.h=dis.readShort();//chieu dai effect
				int countFrame=dis.readShort();//so luong frame
				System.out.println("countEffect>>  "+countFrame);
				//thong tin frame
				for(int j=0;j<countFrame;j++)
				{
					DataEFrame frame= new DataEFrame();
					
					int countListImage=dis.readShort();//so luong list image
					for(int k=0;k<countListImage;k++)
					{
						DataEImage eImage= new DataEImage();
						eImage.smallID=dis.readShort();//id image
						eImage.dx=dis.readShort();
						eImage.dy=dis.readShort();
						
						frame.eImages.addElement(eImage);						
					}	
					
					effect.frames.addElement(frame);
				}
				
				//thong tin sequence
				int countSequence=dis.readShort();
				for(int j=0;j<countSequence;j++)
				{
					Integer sequence= new Integer(dis.readShort());		
					effect.sequences.addElement(sequence);
				}
				Effects[i]=effect;
			}
			dis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
//		
//		try {
//			fis=new FileInputStream("map/data/smallimagemap");
//			dis=new DataInputStream(fis);
//			allInfoSmallImageMap=new byte[dis.available()];
//			dis.read(allInfoSmallImageMap);
//			fis.close();
//			dis.close();
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		try {
//			fis=new FileInputStream("map/data/smallimagepart");
//			dis=new DataInputStream(fis);
//			allInfoSmallImagePlayer=new byte[dis.available()];
//			dis.read(allInfoSmallImagePlayer);
//			fis.close();
//			dis.close();
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		try {//thong tin file small image skill
//			fis=new FileInputStream("map/data/smallimageskill");
//			dis=new DataInputStream(fis);
//			allInfoSmallImageSkill=new byte[dis.available()];
//			dis.read(allInfoSmallImageSkill);
//			fis.close();
//			dis.close();
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		//image x1
//		try {
//			imgItemMap[IMAGE_X1]=new byte[1061][];
//			for(int i=0;i<1061;i++){	
//				
//				File theDir = new File("map/ImageMap_0/"+i+".jpg");
//				if(!theDir.exists())					
//				{
//					fis=new FileInputStream("map/ImageMap_0/"+i+".png");
//				}
//				else
//				{
//					fis=new FileInputStream("map/ImageMap_0/"+i+".jpg");	
//				}
//				
//				dis=new DataInputStream(fis);
//				imgItemMap[IMAGE_X1][i]=new byte[dis.available()];
//				dis.read(imgItemMap[IMAGE_X1][i]);
//				fis.close();
//				dis.close();
//			}
//			
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		//image x2
//		try {
//			imgItemMap[IMAGE_X2]=new byte[1061][];
//			for(int i=0;i<1061;i++){	
//				
//				File theDir = new File("map/ImageMap_1/"+i+".jpg");
//				if(!theDir.exists())					
//				{
//					fis=new FileInputStream("map/ImageMap_1/"+i+".png");
//				}
//				else
//				{
//					fis=new FileInputStream("map/ImageMap_1/"+i+".jpg");	
//				}
//				
//				dis=new DataInputStream(fis);
//				imgItemMap[IMAGE_X2][i]=new byte[dis.available()];
//				dis.read(imgItemMap[IMAGE_X2][i]);
//				fis.close();
//				dis.close();
//			}
//			
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		
//		
//		try {
//			allBigImgMap=new byte[119][];
////			for(int i=0;i<119;i++){
////				fis=new FileInputStream("map/BigImageMap_X2/treebig_"+i+".png");
////				dis=new DataInputStream(fis);
////				allBigImgMap[i]=new byte[dis.available()];
////				dis.read(allBigImgMap[i]);
////				fis.close();
////				dis.close();
////			}
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		//image part x1
//		try {
//			imgItemPart[IMAGE_X1]=new byte[225][];
////			for(int i=0;i<225;i++){
////				fis=new FileInputStream("map/ImagePlayer_X2/"+i+".png");
////				dis=new DataInputStream(fis);
////				imgItemPart[IMAGE_X1][i]=new byte[dis.available()];
////				dis.read(imgItemPart[IMAGE_X1][i]);
////				fis.close();
////				dis.close();
////			}
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		
//		//image part x2
//		try {
//			imgItemPart[IMAGE_X2]=new byte[225][];
////			for(int i=0;i<225;i++){
////				fis=new FileInputStream("map/ImagePlayer_X2/"+i+".png");
////				dis=new DataInputStream(fis);
////				imgItemPart[IMAGE_X2][i]=new byte[dis.available()];
////				dis.read(imgItemPart[IMAGE_X2][i]);
////				fis.close();
////				dis.close();
////			}
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		//image big part x1
//		try {
//			allBigImgPlayer[IMAGE_X1]=new byte[3][];
//			for(int i=0;i<3;i++){
//				fis=new FileInputStream("map/BigImagePlayer_0/treebig_"+i+".png");
//				dis=new DataInputStream(fis);
//				allBigImgPlayer[IMAGE_X1][i]=new byte[dis.available()];
//				dis.read(allBigImgPlayer[IMAGE_X1][i]);
//				fis.close();
//				dis.close();
//			}
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		//image big part x2
//		try {
//			allBigImgPlayer[IMAGE_X2]=new byte[3][];
//			for(int i=0;i<3;i++){
//				fis=new FileInputStream("map/BigImagePlayer_1/treebig_"+i+".png");
//				dis=new DataInputStream(fis);
//				allBigImgPlayer[IMAGE_X2][i]=new byte[dis.available()];
//				dis.read(allBigImgPlayer[IMAGE_X2][i]);
//				fis.close();
//				dis.close();
//			}
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		try {//thong tin image of skill
//			imgItemSkill=new byte[80][];
////			for(int i=0;i<80;i++){
////				fis=new FileInputStream("map/ImageSkill/"+i+".png");
////				dis=new DataInputStream(fis);
////				imgItemSkill[i]=new byte[dis.available()];
////				dis.read(imgItemSkill[i]);
////				fis.close();
////				dis.close();
////			}
//		} catch (Exception e) {
//			e.printStackTrace();
//			
//		}
//		try {//thong tin big image skill
//			allBigImgSkill=new byte[6][];
//			for(int i=0;i<6;i++){				
//				fis=new FileInputStream("map/BigImageSkill_"+0+"/treebig_"+i+".png");
//				dis=new DataInputStream(fis);
//				allBigImgSkill[i]=new byte[dis.available()];
//				dis.read(allBigImgSkill[i]);
//				fis.close();
//				dis.close();
//			}
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		try {
////			for(int i=0;i<8;i++){
////				fis=new FileInputStream("map/mons/"+i+".png");
////				dis=new DataInputStream(fis);
////				byte a[]=new byte[dis.available()];
////				dis.read(a);
////				fis.close();
////				dis.close();
////				fis=new FileInputStream("map/mons/"+i);
////				dis=new DataInputStream(fis);
////				byte b[]=new byte[dis.available()];
////				dis.read(b);
////				fis.close();
////				dis.close();
////				MonsterData mons=new MonsterData(b,a);
////				all_monster.add(mons);
////			}
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//				
//		try {//thong tin big image NPC
//			allBigImgNPC=new byte[1][];
//			for(int i=0;i<1;i++){
//				fis=new FileInputStream("map/BigImageNPC/big_"+i+".png");
//				dis=new DataInputStream(fis);
//				allBigImgNPC[i]=new byte[dis.available()];
//				dis.read(allBigImgNPC[i]);
//				fis.close();
//				dis.close();
//			}
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		
//		try {
//			fis=new FileInputStream("map/data/tree_Line");
//			dis=new DataInputStream(fis);
//			// doc danh sach 
//			short nline=dis.readShort();
//			for(int i=0;i<nline;i++){
//				
//			}
//			fis.close();
//			dis.close();
//		} catch (Exception e) {
//			e.printStackTrace();
//		}	
		
	}
//	public static Image sendByteImg(int idImage){
//		
//		int idImg=0;
//		idImg=idImage;
//		return LoadImage(idImg,(byte) 0 );
//
//	}
	
	public static byte version=1;

}